package com.libinyn.base.pms.serivce.impl.sys;

import com.google.gson.Gson;
import com.libinyn.base.pms.common.exception.PmsException;
import com.libinyn.base.pms.config.redis.SysConfigRedis;
import com.libinyn.base.pms.entity.sys.SysConfigEntity;
import com.libinyn.base.pms.mapper.sys.SysConfigMapper;
import com.libinyn.base.pms.serivce.impl.BaseServiceImpl;
import com.libinyn.base.pms.serivce.sys.SysConfigService;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class SysConfigServiceImpl extends BaseServiceImpl<SysConfigEntity> implements SysConfigService {

	@Resource
	private SysConfigMapper sysConfigDao;
	@Resource
	private SysConfigRedis sysConfigRedis;
	
	@Override
	public void save(SysConfigEntity config) {
		sysConfigDao.insertSelective(config);
		sysConfigRedis.saveOrUpdate(config);
	}

	@Override
	public void update(SysConfigEntity config) {
		sysConfigDao.insertSelective(config);
		sysConfigRedis.saveOrUpdate(config);
	}

	@Override
	public void updateValueByKey(String key, String value) {
		sysConfigDao.updateValueByKey(key, value);
		sysConfigRedis.delete(key);
	}

	@Override
	public void deleteBatch(Long[] ids) throws Exception {
		for(Long id : ids){
			SysConfigEntity config = selectByPrimaryKey(id);
			sysConfigRedis.delete(config.getKey());
		}

//		sysConfigDao.deleteBatch(ids);
	}


	@Override
	public String getValue(String key) {
		SysConfigEntity config = sysConfigRedis.get(key);
		if(config == null){
			config = sysConfigDao.queryByKey(key);
			sysConfigRedis.saveOrUpdate(config);
		}

		return config == null ? null : config.getValue();
	}
	
	@Override
	public <T> T getConfigObject(String key, Class<T> clazz) {
		String value = getValue(key);
		if(StringUtils.isNotBlank(value)){
			return new Gson().fromJson(value, clazz);
		}

		try {
			return clazz.newInstance();
		} catch (Exception e) {
			throw new PmsException("获取参数失败");
		}
	}
}
